﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;
using BombermanExcepciones;

namespace Bomberman
{
	[Serializable]
	public class Articulo : Interactuable
	{
		public const String MejorarVelocidadArticulo = "Habano/Chala";
		public const String MejorarBombaArticulo = "Mejora Bomba Toletole";
		public const String MejoraRetardoBombasArticulo = "Timer";

		private String nombreArticuloActual = null;
		private delegate void AplicarEfecto(Jugador unJugador);
		[NonSerialized()] private Dictionary<String, AplicarEfecto> articulos;

		public Articulo(string nombre)
		{
			DefinirArticulo();
			nombreArticuloActual = nombre;
		}

		public String NombreArticuloActual 
		{
			get { return nombreArticuloActual; }
		}

		public void MejorarVelocidad(Jugador unJugador)
		{
			unJugador.Velocidad = unJugador.Velocidad * 85 / 100;
		}

		public void MejorarBomba(Jugador unJugador)
		{
			unJugador.LanzaBombas.SeleccionarBombaTirar("ToleTole");
		}

		public void MejoraRetardoBombas(Jugador unJugador)
		{
			unJugador.AfectarRetardoBombas();
		}

		private void DefinirArticulo()
		{
			articulos = new Dictionary<string, AplicarEfecto>();
			articulos[Articulo.MejorarVelocidadArticulo] = MejorarVelocidad;
			articulos[Articulo.MejorarBombaArticulo] = MejorarBomba;
			articulos[Articulo.MejoraRetardoBombasArticulo] = MejoraRetardoBombas;
		}

		[OnDeserializing]
		void OnOnDeserializingMethod(StreamingContext sc)
		{
			DefinirArticulo();
		}

		// Implementacion de la interfaz Interactuable
		public void Interactuar(Jugador unJugador)
		{
			if (articulos.ContainsKey(nombreArticuloActual) == false) throw new ArticuloSeleccionadoNoExisteException();

			articulos[nombreArticuloActual](unJugador);
		}

		// Implementacion de la interfaz Atacable
		public void RecibirAtaque(int danio)
		{
			return; 
		}

		// Implementacion de la interfaz Representable
		public String ObtenerNombre()
		{
			return nombreArticuloActual;
		}
	}
}
